package com.jinke.uang.utils.toolutil;
import java.math.BigDecimal;
import java.text.DecimalFormat;


/**
 * 作者：lxn on 2015/12/16 14:25
 * 描述：Utilone ————数字金额运算的工具类
 */
public class MathUtil {
    //默认获取的小数点的后2位
    private static final int FORMAT = 2;

    /**
     * BigDecimal类型的数字和int 类型相乘之后的截取小数点后2位的结果
     * @param price  BigDecimal类型 eg:商品单价
     * @param count  int类型  eg:商品数量
     * @return
     */
    public static BigDecimal getMultiply(BigDecimal price, int count) {
        BigDecimal allprice = price.multiply(new BigDecimal(count));
        allprice= subDigit(allprice,FORMAT);
        return allprice;
    }
    /**
     * BigDecimal类型的数字和int 类型相乘之后以四舍五入的方式取整
     * @param price  BigDecimal类型 eg:商品单价
     * @param count  int类型  eg:商品数量
     * @return  整数结果BigDecimal类型
     */
    public static BigDecimal getMultiplyToInt(BigDecimal price, int count) {
        BigDecimal allprice = price.multiply(new BigDecimal(count));
        allprice= subDigit(allprice,0);
        return allprice;
    }

    /**
     * BigDecimal类型的数字和int 类型相乘之后
     * @param price BigDecimal类型 eg:商品单价
     * @param count int类型  eg:商品数量
     * @param digit int类型  获取小数点后几位
     * @return
     */
    public static BigDecimal getMultiply(BigDecimal price, int count, int digit) {
        BigDecimal allprice = price.multiply(new BigDecimal(count));
        allprice= subDigit(allprice,digit);
        return allprice;
    }

    /**
     * 截取到小数点后几位
     * @param price  BigDecimal类型的数字
     * @param digit  要获取的小数点后几位
     * @return
     */
    public static BigDecimal subDigit(BigDecimal price, int digit){
        if (price == null){
            price = BigDecimal.ZERO;
        }
        BigDecimal returnBigdecimal=price.setScale(digit, BigDecimal.ROUND_HALF_UP);
        return returnBigdecimal;
    }

    /**
     * 把一个String 数字变成整数   ROUND_FLOOR 接近负无穷大的舍入模式。 如果抛异常返回0
     * @param str
     * @return
     */
    public static BigDecimal strToBigDecimalInt(String str){
        BigDecimal strBigDecimal= null;
        try {
            strBigDecimal = new BigDecimal(str);
        } catch (Exception e) {
            e.printStackTrace();
            strBigDecimal=new BigDecimal(0);
        }
        BigDecimal returnBigdecimal=strBigDecimal.setScale(0, BigDecimal.ROUND_FLOOR);
        return returnBigdecimal;
    }

    /**
     * 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指
     * 定精度，以后的数字四舍五入。
     *
     * @param b1    被除数
     * @param b2    除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static int div(BigDecimal b1, BigDecimal b2, int scale) {
        if (scale <= 0) {
         /*   throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");*/
            return 0;
        }
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).intValue();
    }
    /**
     * 把一个数字转换成百分比显示   eg:  20  转成 20%
     * @param math
     * @return
     */
    public static String mathByPercentage(double math){
        BigDecimal bigDecimal = new BigDecimal(math).setScale(2, BigDecimal.ROUND_HALF_UP);
        DecimalFormat df1 = new DecimalFormat("##.##%");
        return df1.format(bigDecimal.divide(new BigDecimal("100")));
    }
    /**
     * 把一个数字转换成百分比显示   eg:  20  转成 20%
     * @param math
     * @return
     */
    public static String mathByPercentageone(double math){
        DecimalFormat df1 = new DecimalFormat("##0.0%");    //##.0%   百分比格式，后面不足2位的用0补齐 四舍五入的
        return df1.format(math/100);
    }

    /**
     * 把一个double 数字转换成 小数点后2位显示的
     * @param math
     * @return  String
     */
    public static String mathTodecimaltwo(double math){

        //这种方式是直接截取的  目前发现这种方法如果参数时double有一定的问题 17.02 截取之后变成了17.01
        BigDecimal b = new BigDecimal(String.valueOf(math));
        b=b.setScale(2, BigDecimal.ROUND_DOWN); //小数位 直接舍去
        return b.toString();
       /* String  rateStr=math+"";
        if(rateStr.indexOf(".") != -1){
            //获取小数点的位置
            int num = 0;
            num = rateStr.indexOf(".");

            //获取小数点后面的数字 是否有两位 不足两位补足两位
            String dianAfter = rateStr.substring(0,num+1);
            String afterData = rateStr.replace(dianAfter, "");
            if(afterData.length() < 2){
                afterData = afterData + "0" ;
            }
            return rateStr.substring(0,num) + "." + afterData.substring(0,2);
        }else{
            if(rateStr == "1"){
                return "100";
            }else{
                return rateStr;
            }
        }*/
    }
    /**
     * 把一个double 数字转换成 小数点后2位显示的
     * @param math
     * @return  String
     */
    public static String mathTodecimalone(String math){

        //这种方式是直接截取的  目前发现这种方法如果参数时double有一定的问题 17.02 截取之后变成了17.01
        BigDecimal b = null;
        try {
            b = new BigDecimal(math);
            b=b.setScale(1, BigDecimal.ROUND_DOWN); //小数位 直接舍去
        } catch (Exception e) {
            e.printStackTrace();
            return "0.0";
        }
        return b.toString();
    }
    /**
     * 把一个double 数字转换成 小数点后2位显示的（这个是四舍五入的）
     * @param math
     * @return  String
     */
    public static String mathTodecimaltwoRu(double math){
        //这种方式是四舍五入的
        BigDecimal b = new BigDecimal(String.valueOf(math));
        b=b.setScale(2, BigDecimal.ROUND_HALF_UP);//四舍五入的
        return b.toString();

    /*    DecimalFormat    df   = new DecimalFormat("######0.00");
        return df.format(math);*/
    }
    /**
     * 把一个double 数字转换成 小数点后2位显示的（这个是四舍五入的）
     * @param math
     * @return  BigDecimal
     */
    public static BigDecimal doubletoBigDecimalRu(double math){
        //这种方式是四舍五入的
        BigDecimal b = new BigDecimal(String.valueOf(math));
        b=b.setScale(2, BigDecimal.ROUND_HALF_UP);//四舍五入的
        return b;
    }






    /**
     * 把一个BigDecimal的数字 (只保留一位小数 后面的直接舍去)
     *
     * @param bigDecimal 数字
     * @return eg 1.12 返回1.2
     */
    public static String bigDecimalToPercentDecimalOne(BigDecimal bigDecimal) {
        if (bigDecimal == null) {
            return "";
        }
        bigDecimal = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP); //保留1位小数后面的直接省去
        DecimalFormat df1 = new DecimalFormat("##.##");
        return df1.format(bigDecimal);
    }

    /**
     * 把一个BigDecimal的数字  (只保留2位小数 后面的直接舍去)
     *
     * @param bigDecimal 数字
     * @return eg 1.2300 返回1.23
     */
    public static String bigDecimalToPercentDecimalTwo(BigDecimal bigDecimal) {
        bigDecimal = bigDecimal.setScale(2, BigDecimal.ROUND_DOWN); //保留2位小数后面的直接省去
        DecimalFormat df1 = new DecimalFormat("#0.00");
        return df1.format(bigDecimal);
    }
    /**
     * 提供精确的减法运算。
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static BigDecimal sub(BigDecimal v1, BigDecimal v2){
        return v1.subtract(v2);
    }
    /**
     * 判断一个数是否大于0
     * @param bigDecimal
     * @return
     */
    public static boolean isGreaterThan0(BigDecimal bigDecimal) {
        //结果是:-1 小于,0 等于,1 大于
        int compare = bigDecimal.compareTo(new BigDecimal("0"));
        if (1 == compare) {
            return true;
        } else {
            return false;
        }
    }


    /**
     * 根据借款金额计算每天费率
     * @param money
     * @param rate
     * @return
     */
    public static String calculateMoney(String  money,String rate,String day){
        try {
            BigDecimal borrowMoney= strToBigDecimalInt(money);
            BigDecimal  ratebg=new BigDecimal(rate.split("%")[0]);
            BigDecimal  daybg=new BigDecimal(day);
            BigDecimal result=borrowMoney.multiply(ratebg).multiply(daybg).divide(new BigDecimal("100"));
            result=result.setScale(0, BigDecimal.ROUND_HALF_UP);
            return result.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
    /**
     * 根据借款金额计算每天费率
     * @param money
     * @param rate
     * @return
     */
    public static String calculateMoneyNo(String  money,String rate,String day){
        try {
            BigDecimal borrowMoney= strToBigDecimalInt(money);
            BigDecimal  ratebg=new BigDecimal(rate);
            BigDecimal  daybg=new BigDecimal(day);
            BigDecimal result=borrowMoney.multiply(ratebg).multiply(daybg).divide(new BigDecimal("100"));
            result=result.setScale(0, BigDecimal.ROUND_HALF_UP);
            return result.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}